import { _decorator, Component, SpriteFrame, Texture2D, Prefab, instantiate, Node } from 'cc';
import { GameFramework } from '../core/runtime/base/GameFramework';


const { ccclass, property } = _decorator;

@ccclass('GameManager')
export class GameManager extends Component {
    start() {
        // 演示资源系统的各种用法
        this.demoResourceSystem();
    }

    update(deltaTime: number) {
        
    }

    // 演示资源系统的使用方法
    private async demoResourceSystem() {
        // 1. 加载单个资源
        await this.loadSingleResource();

        // 2. 预加载多个资源
        await this.preloadResources();

        // 3. 使用对象池
        this.useObjectPool();

        // 4. 释放资源
        this.releaseResources();
    }

    /**
     * 加载单个资源示例
     */
    private async loadSingleResource() {
        try {
            // 加载图片资源
            const spriteFrame = await GameFramework.resource.load<SpriteFrame>('textures/logo', SpriteFrame);
            console.log('图片资源加载成功:', spriteFrame.name);

            // 加载预制体资源
            const prefab = await GameFramework.resource.load<Prefab>('prefabs/Player', Prefab);
            console.log('预制体资源加载成功:', prefab.name);

            // 使用加载的预制体创建节点
            const playerNode = instantiate(prefab);
            this.node.addChild(playerNode);

        } catch (error) {
            console.error('资源加载失败:', error);
        }
    }

    /**
     * 预加载多个资源示例
     */
    private async preloadResources() {
        try {
            // 定义要预加载的资源路径数组
            const preloadPaths = [
                'textures/background',
                'textures/enemy',
                'prefabs/Bullet',
                'prefabs/Enemy'
            ];

            // 预加载资源并显示进度
            await GameFramework.resource.preload(
                preloadPaths, 
                SpriteFrame, // 或其他资源类型
                (finished, total) => {
                    console.log(`预加载进度: ${finished}/${total}`);
                }
            );

            console.log('所有资源预加载完成');
        } catch (error) {
            console.error('预加载失败:', error);
        }
    }

    /**
     * 使用对象池示例
     */
    private useObjectPool() {
        // 获取子弹预制体的对象池
        const bulletPool = GameFramework.resource.getPool('Bullet');

        // 从对象池中获取节点（如果对象池为空，则内部会自动创建新节点）
        const bulletNode = bulletPool.get();
        
        if (bulletNode) {
            // 设置子弹位置
            bulletNode.setPosition(0, 0, 0);
            
            // 添加到场景中
            this.node.addChild(bulletNode);
            
            console.log('从对象池获取子弹节点');
        }

        // 模拟子弹销毁，回收到对象池
        // 在实际项目中，这通常在子弹飞出屏幕或击中目标时调用
        setTimeout(() => {
            if (bulletNode && bulletNode.isValid) {
                // 从场景中移除
                bulletNode.removeFromParent();
                
                // 回收到对象池
                bulletPool.put(bulletNode);
                
                console.log('子弹节点回收到对象池');
            }
        }, 3000);
    }

    /**
     * 释放资源示例
     */
    private releaseResources() {
        // 释放单个资源
        GameFramework.resource.release('textures/logo');
        console.log('释放 textures/logo 资源');

        // 注意：通过对象池创建的资源不会被自动释放
        // 需要手动清理对象池
    }

    /**
     * 实际游戏中的使用示例：加载游戏场景
     */
    private async loadGameScene() {
        try {
            // 预加载游戏所需的所有资源
            const gameAssets = [
                'game/player',
                'game/enemy',
                'game/background',
                'game/bullet'
            ];

            await GameFramework.resource.preload(gameAssets, SpriteFrame, (finished, total) => {
                // 更新加载界面进度条
                const progress = finished / total;
                console.log(`游戏资源加载进度: ${Math.floor(progress * 100)}%`);
                
                // 这里可以更新UI进度条
                // this.updateLoadingBar(progress);
            });

            console.log('游戏资源加载完成，开始游戏');

            // 加载背景图片
            const backgroundSprite = await GameFramework.resource.load<SpriteFrame>('game/background', SpriteFrame);
            
            // 加载玩家预制体
            const playerPrefab = await GameFramework.resource.load<Prefab>('game/player', Prefab);
            
            // 创建游戏对象
            // const background = new Node('Background');
            // const spriteComponent = background.addComponent(Sprite);
            // spriteComponent.spriteFrame = backgroundSprite;
            // this.node.addChild(background);
            
            const player = instantiate(playerPrefab);
            this.node.addChild(player);

        } catch (error) {
            console.error('游戏场景加载失败:', error);
        }
    }

    /**
     * 实际游戏中的使用示例：处理关卡切换
     */
    private async switchLevel(currentLevel: number, nextLevel: number) {
        // 释放当前关卡特有的资源
        const currentLevelAssets = this.getLevelAssets(currentLevel);
        currentLevelAssets.forEach(assetPath => {
            GameFramework.resource.release(assetPath);
        });

        // 预加载下一关卡的资源
        const nextLevelAssets = this.getLevelAssets(nextLevel);
        try {
            await GameFramework.resource.preload(nextLevelAssets, SpriteFrame, (finished, total) => {
                const progress = finished / total;
                console.log(`关卡${nextLevel}资源加载进度: ${Math.floor(progress * 100)}%`);
            });

            console.log(`关卡${nextLevel}资源加载完成`);
            // 切换到下一关卡场景
            // this.changeToLevel(nextLevel);
        } catch (error) {
            console.error(`关卡${nextLevel}资源加载失败:`, error);
        }
    }

    /**
     * 获取关卡所需资源列表
     * @param level 关卡编号
     */
    private getLevelAssets(level: number): string[] {
        // 根据关卡编号返回该关卡需要的资源路径数组
        switch (level) {
            case 1:
                return ['level1/enemy1', 'level1/background', 'level1/music'];
            case 2:
                return ['level2/enemy2', 'level2/background', 'level2/music'];
            default:
                return [];
        }
    }

    /**
     * 实际游戏中的使用示例：UI资源管理
     */
    private async loadUIResources() {
        try {
            // 加载UI图片资源
            const buttonSprite = await GameFramework.resource.load<SpriteFrame>('ui/button_normal', SpriteFrame);
            const panelSprite = await GameFramework.resource.load<SpriteFrame>('ui/panel_background', SpriteFrame);
            
            console.log('UI资源加载完成');
            
            // 使用资源创建UI元素
            // this.createUIButton(buttonSprite);
            // this.createUIPanel(panelSprite);
        } catch (error) {
            console.error('UI资源加载失败:', error);
        }
    }
}